import { DispatchOptions, Store, CommitOptions } from 'vuex';


declare module 'vue/types/vue' {
    interface Vue {
        /**
         * 以 typescript 定义 vuex 的 store。
         * 备用，直接对 `$store` 的定义目前不可靠（需要修改依赖文件）
         */
        $storeTS: MyStore;
    }
}

/**
 * 当前 vuex 状态的定义接口。
 */
export interface State {
}

/**
 * 扩展的 store 定义
 */
export interface MyStore extends Store<State> {
    getters: Getters
    commit: Commit
    dispatch: Dispatch
}

interface Commit {
    <K extends keyof CommitTree>(type: K, payload?: CommitTree[K], options?: CommitOptions): void;
}

interface Dispatch {
    <K extends keyof DispatchTree>(
        type: K,
        payload?: DispatchTree[K]['arg'],
        options?: DispatchOptions
    ): Promise<DispatchTree[K]['ret']>;
}

/**
 * 计算属性树的定义。
 * 需要各个模块下扩展定义
 */
export interface Getters {
    /** 新标题（测试） */
    new_title: string
}

/**
 * 提交变动定义。
 * 其它模块中对该提交树进行扩展定义: `"example_mutations": string`。
 */
export interface CommitTree {
    "example_mutations": string
}

/**
 * 调度树定义。
 * 其它模块中对该调度树接口进行扩展定义:  `"example_action": DispatchTreeNode<string, string>`
 */
export interface DispatchTree {
    "example_action": DispatchTreeNode<string, string>
}

/**
 * 前台与状态调度的荷载接口。
 * 建议模块中的调度的扩展定义都以该接口实现。
 */
export interface DispatchTreeNode<Targ, Tret> {
    /** 调度给状态的参数 */
    arg: Targ,
    /** 反馈给前台的结果 */
    ret: Tret
}